package com.xiaoming.backend.util;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.reflect.FieldUtils;

/**
        * 深度拷贝工具类（支持对象及集合）
        * @version 1.1
        */
public class DeepCopyUtil {
    private static final ObjectMapper objectMapper = new ObjectMapper();

    /**
            * 跨类深度拷贝（支持 BO→VO 场景）
            * @param source      源对象（如 BO）
            * @param targetClass 目标类（如 VO）
            * @return 目标类实例
     * @throws RuntimeException 拷贝异常
     */
    public static <T> T copyByJackson(Object source, Class<T> targetClass) {
        try {
            return objectMapper.readValue(objectMapper.writeValueAsString(source), targetClass);
        } catch (Exception e) {
            throw new RuntimeException("跨类深拷贝失败", e);
        }
    }

    /**
            * 反射递归拷贝（兼容不同类但字段名相同的场景）
            * @param source 源对象
     * @param target 目标对象空实例
     */
    public static void copyByReflection(Object source, Object target) {
        FieldUtils.getAllFieldsList(source.getClass()).forEach(field -> {
            try {
                field.setAccessible(true);
                Object value = field.get(source);
                FieldUtils.writeField(target, field.getName(), deepClone(value), true);
            } catch (Exception e) {
                // 忽略无法拷贝的字段
            }
        });
    }

    private static Object deepClone(Object obj) {
        if (obj == null) return null;
        try {
            return copyByJackson(obj, obj.getClass());
        } catch (Exception e) {
            return obj; // 简单对象直接返回
        }
    }
}